home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / capus2 / 3dview / sources / 3dfonctions.e < prev    next >
Text File  |  1994-10-09  |  13KB  |  311 lines

  1. /*"Rotation et refresh de la vue 3D."*/
  2. /*"p_RotationBase(r_axe,r_angle) :Effectue une rotation de tous les objs.<r_axe>=Axe (3dview.m),<r_angle>=en rad."*/
  3. PROC p_RotationBase(r_axe,r_angle)
  4. /********************************************************************************
  5.  * Para         : Axe of rotation (see 3Dview.i or .m),Angle (in rad).
  6.  * Return       : NONE
  7.  * Description  : Rotate all objects.
  8.  *******************************************************************************/
  9.     DEF old_x=NIL,old_y=NIL,old_z=NIL
  10.     DEF new_x=NIL,new_y=NIL,new_z=NIL
  11.     DEF adr_x=NIL,adr_y=NIL,adr_z=NIL
  12.     DEF r_obj:PTR TO object3d,r_point=NIL,n_pts=NIL,b_pts=NIL
  13.     DEF r_req=NIL
  14.     DEF thelist:PTR TO lh,thenode:PTR TO ln
  15.     dWriteF(['p_RotationBase() Axe:\d',' Angle :\d\n'],[r_axe,r_angle])
  16.     r_req:=p_InitReq('Rotate Object(s) ')
  17.     thelist:=mybase.objlist
  18.     thenode:=thelist.head
  19.     WHILE thenode
  20.         IF thenode.succ<>0
  21.             r_obj:=thenode
  22.             r_point:=r_obj.datapts
  23.             n_pts:=r_obj.nbrspts
  24.             FOR b_pts:=0 TO n_pts-1
  25.                 adr_x:=r_point
  26.                 adr_y:=r_point+4
  27.                 adr_z:=r_point+8
  28.                 old_x:=Long(adr_x)
  29.                 old_y:=Long(adr_y)
  30.                 old_z:=Long(adr_z)
  31.                 SELECT r_axe
  32.                     CASE AXE_X
  33.                         new_x:=SpFlt(old_x)
  34.                         new_y:=SpSub(SpMul(SpFlt(old_z),SpSin(r_angle)),SpMul(SpFlt(old_y),SpCos(r_angle)))
  35.                         new_z:=SpAdd(SpMul(SpFlt(old_y),SpSin(r_angle)),SpMul(SpFlt(old_z),SpCos(r_angle)))
  36.                     CASE AXE_Y
  37.                         new_x:=SpSub(SpMul(SpFlt(old_z),SpSin(r_angle)),SpMul(SpFlt(old_x),SpCos(r_angle)))
  38.                         new_y:=SpFlt(old_y)
  39.                         new_z:=SpAdd(SpMul(SpFlt(old_x),SpSin(r_angle)),SpMul(SpFlt(old_z),SpCos(r_angle)))
  40.                     CASE AXE_Z
  41.                         new_x:=SpSub(SpMul(SpFlt(old_y),SpSin(r_angle)),SpMul(SpFlt(old_x),SpCos(r_angle)))
  42.                         new_y:=SpAdd(SpMul(SpFlt(old_x),SpSin(r_angle)),SpMul(SpFlt(old_y),SpCos(r_angle)))
  43.                         new_z:=SpFlt(old_z)
  44.                 ENDSELECT
  45.                 ^adr_x:=SpFix(new_x)
  46.                 ^adr_y:=SpFix(new_y)
  47.                 ^adr_z:=SpFix(new_z)
  48.                 r_point:=r_point+12
  49.             ENDFOR
  50.         ENDIF
  51.         thenode:=thenode.succ
  52.     ENDWHILE
  53.     CloseW(r_req)
  54. ENDPROC
  55. /**/
  56. /*"p_DrawBase() :redessine le base 3D."*/
  57. PROC p_DrawBase()
  58. /********************************************************************************
  59.  * Para         : NONE
  60.  * Return       : NONE
  61.  * Description  : Parse objects (bounded,selected) and call draw_face().
  62.  *******************************************************************************/
  63.     DEF d_obj:PTR TO object3d
  64.     DEF b_faces,t_faces,d_faces,curs
  65.     DEF stop_mes:PTR TO intuimessage,stop_type,stop_infos
  66.     DEF adr_req
  67.     DEF mylist:PTR TO lh,mynode:PTR TO ln
  68.     /*DEF num_obj,num_p1,num_p2,num_p3*/
  69.     DEF list_vertices,list_datapts
  70.     dWriteF(['p_DrawBase()'],[0])
  71.     adr_req:=p_InitReq('Drawing ')
  72.     SetAPen(view_window.rport,0)
  73.     SetRast(view_window.rport,0)
  74.     SetAPen(view_window.rport,1)
  75.     mylist:=mybase.objlist
  76.     mynode:=mylist.head
  77.     WHILE mynode
  78.         IF mynode.succ<>0
  79.             d_obj:=mynode
  80.             IF d_obj.selected=TRUE THEN SetAPen(view_window.rport,mybase.rgbselect) ELSE SetAPen(view_window.rport,mybase.rgbnormal)
  81.             IF d_obj.bounded=TRUE
  82.                 list_vertices:=[d_obj.objminx,d_obj.objminy,d_obj.objminz,
  83.                                 d_obj.objminx,d_obj.objmaxy,d_obj.objminz,
  84.                                 d_obj.objmaxx,d_obj.objmaxy,d_obj.objminz,
  85.                                 d_obj.objmaxx,d_obj.objminy,d_obj.objminz,
  86.                                 d_obj.objminx,d_obj.objminy,d_obj.objmaxz,
  87.                                 d_obj.objminx,d_obj.objmaxy,d_obj.objmaxz,
  88.                                 d_obj.objmaxx,d_obj.objmaxy,d_obj.objmaxz,
  89.                                 d_obj.objmaxx,d_obj.objminy,d_obj.objmaxz]
  90.                 SetAPen(view_window.rport,2)
  91.                 t_faces:=12
  92.                 d_faces:=data_boundedbox
  93.                 list_datapts:=list_vertices
  94.             ELSE
  95.                 t_faces:=d_obj.nbrsfcs
  96.                 d_faces:=d_obj.datafcs
  97.                 list_datapts:=d_faces
  98.             ENDIF
  99.             curs:=d_faces
  100.             FOR b_faces:=0 TO t_faces-1
  101.                 p_DrawFace(d_obj,Long(curs),Long(curs+4),Long(curs+8),list_datapts)
  102.                 curs:=curs+12
  103.                 IF stop_mes:=Gt_GetIMsg(view_window.userport)
  104.                     stop_type:=stop_mes.class
  105.                     IF stop_type=IDCMP_RAWKEY
  106.                         stop_infos:=stop_mes.code
  107.                         IF stop_infos=$21 THEN JUMP fini
  108.                     ENDIF
  109.                 ENDIF
  110.             ENDFOR
  111.             IF list_vertices THEN Dispose(list_vertices)
  112.         ENDIF
  113.         mynode:=mynode.succ
  114.     ENDWHILE
  115.     JUMP fini
  116.     fini:
  117.     WHILE stop_mes:=Gt_GetIMsg(view_window.userport) DO Gt_ReplyIMsg(stop_mes)
  118.     CloseW(adr_req)
  119. ENDPROC
  120. /**/
  121. /*"p_DrawFace(d_obj,num_p1,num_p2,num_p3) :Dessine une face."*/
  122. PROC p_DrawFace(d_obj:PTR TO object3d,num_p1,num_p2,num_p3,list_datapts)
  123. /********************************************************************************
  124.  * Para         : Num object,Num vertice 1,Num vertice 2,Num vertice 3,datapts
  125.  * Return       : NONE
  126.  * Description  : Draw one face.
  127.  *******************************************************************************/
  128.     DEF x1,y1,z1,x2,y2,z2,x3,y3,z3
  129.     DEF fx_one=NIL,fx_two=NIL,fx_three=NIL,fy_one=NIL,fy_two=NIL,fy_three=NIL
  130.     DEF plan
  131.     plan:=mybase.plan
  132.     IF d_obj.bounded=FALSE
  133.         list_datapts:=d_obj.datapts
  134.     ENDIF
  135.     x1:=mybase.signex*Long(list_datapts+(num_p1*12))
  136.     y1:=mybase.signey*Long(list_datapts+(num_p1*12)+4)
  137.     z1:=mybase.signez*Long(list_datapts+(num_p1*12)+8)
  138.     x2:=mybase.signex*Long(list_datapts+(num_p2*12))
  139.     y2:=mybase.signey*Long(list_datapts+(num_p2*12)+4)
  140.     z2:=mybase.signez*Long(list_datapts+(num_p2*12)+8)
  141.     x3:=mybase.signex*Long(list_datapts+(num_p3*12))
  142.     y3:=mybase.signey*Long(list_datapts+(num_p3*12)+4)
  143.     z3:=mybase.signez*Long(list_datapts+(num_p3*12)+8)
  144.     SELECT plan
  145.         CASE PLAN_XOY
  146.             fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x1)),mybase.format),SpFlt(mybase.centrex))
  147.             fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x2)),mybase.format),SpFlt(mybase.centrex))
  148.             fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x3)),mybase.format),SpFlt(mybase.centrex))
  149.             fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(y1)),SpFlt(mybase.centrey))
  150.             fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(y2)),SpFlt(mybase.centrey))
  151.             fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(y3)),SpFlt(mybase.centrey))
  152.         CASE PLAN_XOZ
  153.             fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x1)),mybase.format),SpFlt(mybase.centrex))
  154.             fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x2)),mybase.format),SpFlt(mybase.centrex))
  155.             fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x3)),mybase.format),SpFlt(mybase.centrex))
  156.             fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(z1)),SpFlt(mybase.centrey))
  157.             fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(z2)),SpFlt(mybase.centrey))
  158.             fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(z3)),SpFlt(mybase.centrey))
  159.         CASE PLAN_YOZ
  160.             fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y1)),mybase.format),SpFlt(mybase.centrex))
  161.             fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y2)),mybase.format),SpFlt(mybase.centrex))
  162.             fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y3)),mybase.format),SpFlt(mybase.centrex))
  163.             fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(z1)),SpFlt(mybase.centrey))
  164.             fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(z2)),SpFlt(mybase.centrey))
  165.             fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(z3)),SpFlt(mybase.centrey))
  166.     ENDSELECT
  167.     x1:=SpFix(fx_one)
  168.     x2:=SpFix(fx_two)
  169.     x3:=SpFix(fx_three)
  170.     y1:=SpFix(fy_one)
  171.     y2:=SpFix(fy_two)
  172.     y3:=SpFix(fy_three)
  173.     IF ((mybase.drawmode=DRAW_PTS) OR (mybase.drawmode=DRAW_PTSFCS))
  174.         SetAPen(view_window.rport,mybase.rgbpts)
  175.         RectFill(view_window.rport,x1-1,y1-1,x1+1,y1+1)
  176.         RectFill(view_window.rport,x2-1,y2-1,x2+1,y2+1)
  177.         RectFill(view_window.rport,x3-1,y3-1,x3+1,y3+1)
  178.         /*=================================
  179.         WritePixel(view_window.rport,x1,y1)
  180.         WritePixel(view_window.rport,x2,y2)
  181.         WritePixel(view_window.rport,x3,y3)
  182.         ===================================*/
  183.         SetAPen(view_window.rport,mybase.rgbnormal)
  184.     ENDIF
  185.     IF ((mybase.drawmode=DRAW_FCS) OR (mybase.drawmode=DRAW_PTSFCS))
  186.     IF d_obj.selected=TRUE
  187.         SetAPen(view_window.rport,mybase.rgbselect)
  188.     ELSEIF d_obj.bounded=TRUE
  189.         SetAPen(view_window.rport,mybase.rgbbounding)
  190.     ELSE
  191.         SetAPen(view_window.rport,mybase.rgbnormal)
  192.     ENDIF
  193.  
  194.         Move(view_window.rport,x1,y1)
  195.         Draw(view_window.rport,x2,y2)
  196.         Move(view_window.rport,x2,y2)
  197.         Draw(view_window.rport,x3,y3)
  198.         Move(view_window.rport,x3,y3)
  199.         Draw(view_window.rport,x1,y1)
  200.     ENDIF
  201. ENDPROC
  202. /**/
  203. /*"p_CentreObjs() :Centre tous les objets."*/
  204. PROC p_CentreObjs()
  205. /********************************************************************************
  206.  * Para         : NONE
  207.  * Return       : NONE
  208.  * Description  : Center Database in 0,0,0 and Call rebuildminmax().
  209.  *******************************************************************************/
  210.     DEF c_obj:PTR TO object3d,cp=NIL,curs=NIL
  211.     DEF c_point:PTR TO vertices
  212.     DEF mylist:PTR TO lh,mynode:PTR TO ln
  213.     dWriteF(['CentreObjs()\n'],[0])
  214.     mylist:=mybase.objlist
  215.     mynode:=mylist.head
  216.     WHILE mynode
  217.         IF mynode.succ<>0
  218.             c_obj:=mynode
  219.             curs:=c_obj.datapts
  220.             dWriteF(['Obj Adr:\h ','NbrsPts:\d\n'],[c_obj,c_obj.nbrspts])
  221.             c_obj.objcx:=c_obj.objcx-mybase.basecx
  222.             c_obj.objcy:=c_obj.objcy-mybase.basecy
  223.             c_obj.objcz:=c_obj.objcz-mybase.basecz
  224.             FOR cp:=0 TO c_obj.nbrspts-1
  225.                 c_point:=curs
  226.                 c_point.x:=c_point.x-mybase.basecx
  227.                 c_point.y:=c_point.y-mybase.basecy
  228.                 c_point.z:=c_point.z-mybase.basecz
  229.                 curs:=curs+12
  230.             ENDFOR
  231.         ENDIF
  232.         mynode:=mynode.succ
  233.     ENDWHILE
  234.     p_RebuildMinMax()
  235. ENDPROC
  236. /**/
  237. /*"p_RebuildMinMax() :recalcule les lini est maxi des objets."*/
  238. PROC p_RebuildMinMax() 
  239. /********************************************************************************
  240.  * Para         : NONE
  241.  * Return       : NONE
  242.  * Description  : rebuild the Min and Max of all objects and database.
  243.  *******************************************************************************/
  244.     DEF re_obj:PTR TO object3d
  245.     DEF re_pts:PTR TO vertices
  246.     DEF b1=NIL,curs,nx,ny,nz
  247.     DEF o_minx,o_maxx,o_miny,o_maxy,o_minz,o_maxz,o_cx=NIL,o_cy=NIL,o_cz=NIL
  248.     DEF mylist:PTR TO lh,mynode:PTR TO ln
  249.     mybase.minx:=10000000
  250.     mybase.maxx:=-10000000
  251.     mybase.miny:=10000000
  252.     mybase.maxy:=-10000000
  253.     mybase.minz:=10000000
  254.     mybase.maxz:=-10000000
  255.     /*****************/
  256.     mylist:=mybase.objlist
  257.     mynode:=mylist.head
  258.     WHILE mynode
  259.         IF mynode.succ<>0
  260.             re_obj:=mynode
  261.             o_minx:=10000000
  262.             o_maxx:=-10000000
  263.             o_miny:=10000000
  264.             o_maxy:=-10000000
  265.             o_minz:=10000000
  266.             o_maxz:=-10000000
  267.             re_pts:=re_obj.datapts
  268.             curs:=re_pts
  269.             FOR b1:=0 TO re_obj.nbrspts-1
  270.                 re_pts:=curs
  271.                 nx:=re_pts.x
  272.                 ny:=re_pts.y
  273.                 nz:=re_pts.z
  274.                 IF nx>=mybase.maxx THEN mybase.maxx:=nx
  275.                 IF nx<mybase.minx THEN mybase.minx:=nx
  276.                 IF ny>=mybase.maxy THEN mybase.maxy:=ny
  277.                 IF ny<mybase.miny THEN mybase.miny:=ny
  278.                 IF nz>=mybase.maxz THEN mybase.maxz:=nz
  279.                 IF nz<mybase.minz THEN mybase.minz:=nz
  280.                 /**********************/
  281.                 IF nx>=o_maxx THEN o_maxx:=nx
  282.                 IF nx<o_minx THEN o_minx:=nx
  283.                 IF ny>=o_maxy THEN o_maxy:=ny
  284.                 IF ny<o_miny THEN o_miny:=ny
  285.                 IF nz>=o_maxz THEN o_maxz:=nz
  286.                 IF nz<o_minz THEN o_minz:=nz
  287.                 curs:=curs+12
  288.             ENDFOR
  289.             o_cx:=o_minx+Div((o_maxx-o_minx),2)
  290.             o_cy:=o_miny+Div((o_maxy-o_miny),2)
  291.             o_cz:=o_minz+Div((o_maxz-o_minz),2)
  292.             re_obj.objcx:=o_cx
  293.             re_obj.objcy:=o_cy
  294.             re_obj.objcz:=o_cz
  295.             re_obj.objminx:=o_minx
  296.             re_obj.objmaxx:=o_maxx
  297.             re_obj.objminy:=o_miny
  298.             re_obj.objmaxy:=o_maxy
  299.             re_obj.objminz:=o_minz
  300.             re_obj.objmaxz:=o_maxz
  301.         ENDIF
  302.         mynode:=mynode.succ
  303.     ENDWHILE
  304.     mybase.basecx:=mybase.minx+Div((mybase.maxx-mybase.minx),2)
  305.     mybase.basecy:=mybase.miny+Div((mybase.maxy-mybase.miny),2)
  306.     mybase.basecz:=mybase.minz+Div((mybase.maxz-mybase.minz),2)
  307. ENDPROC
  308. /**/
  309. /**/
  310.  
  311.